//
//  ViewController.m
//  ly
//
//  Created by honeyrr on 2017/12/24.
//  Copyright © 2017年 honeyrr. All rights reserved.
//
//
//
//  蓝牙4.0 CoreBluetooth : 真机调试(模拟器不行)
//  介绍一下类的作用：
//  CBCentralManager: 中心角色：用来扫描外部设备
//  CBPeripheral: 外设（外部设备）：CBPeripheral有设备的名称、身份等等
//  CBPeripheralManager: 外部设备管理：外部设备在扫描、配对连接时显示的信息

#import "ViewController.h"

/* 一个输出打印信息的宏定义 调用：ly_NSLog(@"hello") */
#ifdef DEBUG
# define ly_NSLog(fmt, ...) NSLog((@"\n 文件名:%s\n" " 函数名:%s \n" " 行号:%d \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define ly_NSLog(...);
#endif

@interface ViewController ()<CBCentralManagerDelegate,CBPeripheralDelegate,UITableViewDelegate, UITableViewDataSource>
/* 用来存储扫描到的外部设备 */
@property(nonatomic, strong) NSMutableArray *marr;
/* 将扫描到的外部设备用tableView展示 */
@property (weak, nonatomic) IBOutlet UITableView *tableView;
/* 设置搜索按钮 */
@property(nonatomic, strong) UIButton *searchBtn;

@end

@implementation ViewController

#pragma mark - 懒加载
-(NSMutableArray *)marr
{
    if (!_marr) {
        _marr = [NSMutableArray array];
    }
    return _marr;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.tableView.tableFooterView = [UIView new];
    
    /* 在viewDidLoad中实例化并设置代理 */
    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
    
    /* 设置搜索按钮 */
    [self setSearchBtn];
}

#pragma mark - 设置搜索按钮
-(void) setSearchBtn
{
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(5, self.view.frame.size.height - 50, self.view.frame.size.width - 10, 44)];
    [btn setTitle:@"扫描设备" forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor blueColor]];
    [btn addTarget:self action:@selector(searchDevcie) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    _searchBtn = btn;
}

#pragma mark - ⭐️⭐️⭐️⭐️⭐️CBCentralManagerDelegate⭐️⭐️⭐️⭐️⭐️
/* 当前设备蓝牙的状态 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    switch (central.state) {
        case CBManagerStateUnknown:
            NSLog(@"----------设备类型位置----------");
            break;
        case CBManagerStateResetting:
            NSLog(@"----------设备初始化中----------");
            break;
        case CBManagerStateUnsupported:
            NSLog(@"----------不支持蓝牙----------");
            [self notSupport];
            break;
        case CBManagerStateUnauthorized:
            NSLog(@"----------设备未授权----------");
            break;
        case CBManagerStatePoweredOff:
            NSLog(@"------蓝牙未开启-----");
            break;
        case CBManagerStatePoweredOn:
            ly_NSLog(@"------> 蓝牙已开始");
            //自动扫描,调用扫描方法
            [self searchDevcie];
            break;
        default:
            NSLog(@"--------ERROR---------");
            break;
    }
}

/* 不支持蓝牙 */
-(void)notSupport
{
    //不支持蓝牙让搜索按钮不可点击
    [self.searchBtn setEnabled:NO];
    
    UILabel *lable = [[UILabel alloc]initWithFrame:[UIScreen mainScreen].bounds];
    lable.text = @"该设备不支持蓝牙";
    lable.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:lable];
}

/**
 扫描设备Method
 */
- (void)searchDevcie
{
    [self.centralManager scanForPeripheralsWithServices:nil options:nil];
    [_marr removeAllObjects];
    [self.tableView reloadData];
}


/**
 每当搜索到一个外设之后，都会自动触发以下方法，每发现一个蓝牙设备都会调用此函数
 以下是Method的参数：
 @param central 中心管理者
 @param peripheral 设备信息
 @param advertisementData 外设携带的数据
 @param RSSI 外设发出的蓝牙信号强度
 */
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI
{
    /* 打印已扫描到的设备信息 */
    NSLog(@"%@",peripheral);
    
    /* ⭐️⭐️⭐️⭐️⭐️ 将已扫描的 ‘设备’(CBPeripheral对象) 添加到数组中 */
    [_marr addObject:peripheral];
    [self.tableView reloadData];
}

/**
 从设备列表选中我们要的设备,连接设备
 参数：
 @param peripheral 外部设备
 */
- (void)connectDevice:(CBPeripheral *)peripheral
{
    [self.centralManager connectPeripheral:peripheral options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:CBConnectPeripheralOptionNotifyOnDisconnectionKey]];
}

/**
 中心管理者连接外设成功(如果外设成功与中心设备连接成功之后会自动触发该方法)
 参数：
 @param central 中心管理者
 @param peripheral 外设
 */
- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral
{
    ly_NSLog(@"✅✅✅✅✅ 连接成功 ✅✅✅✅✅");
    // 标记我们的外设,让他的生命周期 = ViewController
    self.peripheral = peripheral;
    //  设置外设的代理
    self.peripheral.delegate = self;
    // 外设发现服务,传nil代表不过滤
    //调用该方法后，将会自动调用didDiscoverServices()代理方法，用于发现服务
    [self.peripheral discoverServices:nil];
    //既然连接上了，为了解决性能，就停止扫描吧
    [self.centralManager stopScan];
}
// 外设连接失败
- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"😒😒😒😒😒 连接失败 😒😒😒😒😒");
    NSLog(@"错误信息：%@",error.description);
}
// 丢失连接
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
    NSLog(@"❌❌❌❌❌ 断开连接 ❌❌❌❌❌");
    NSLog(@"错误信息：%@",error.description);
}

#pragma mark - ⭐️⭐️⭐️⭐️⭐️UITableViewDelegate⭐️⭐️⭐️⭐️⭐️
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.marr count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *ID = @"myCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    /* 拿到CBPeripheral对象 */
    CBPeripheral *peripheral = _marr[indexPath.row];
    if (peripheral.name.length == 0) {
        cell.textLabel.text = @"未知设备";
    } else {
        cell.textLabel.text = peripheral.name;
    }
    cell.detailTextLabel.text = peripheral.identifier.UUIDString;
    cell.backgroundColor = [UIColor yellowColor];
    return cell;
}

/* 点击cell进行连接 */
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self connectDevice:_marr[indexPath.row]];
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"设备列表";
}

@end
